# RVC Controller SW — Design Class Diagram

| 항목 | 내용 |
|------|------|
| 문서 번호 | RVC-CD-001 |
| 버전 | v1.0 |
| 작성일 | 2026-05-19 |
| 작성자 | OOAD Team |
| 상태 | 초안 (Draft) |

---

## 변경 이력 (Change History)

| 버전 | 날짜 | 변경 내용 | 작성자 |
|------|------|-----------|--------|
| v1.0 | 2026-05-19 | 최초 작성 — Domain Model + SSD System Operations 기반 Design Class Diagram 도출 | OOAD Team |

---

## 1. Design Class Diagram

> Domain Model과의 차이: 메서드(가시성·파라미터·반환타입) 추가, System Operations → Controller 공개 인터페이스 반영

```mermaid
---
title: "Design Class Diagram — RVC Controller SW"
---
classDiagram
    direction TB

    class RVCState {
        <<enumeration>>
        CLEANING
        STOPPED
        TURNING
        REVERSING
    }
    class Direction {
        <<enumeration>>
        FORWARD
        BACKWARD
        LEFT
        RIGHT
    }
    class PowerLevel {
        <<enumeration>>
        NORMAL
        BOOSTED
    }
    class SensorStatus {
        <<enumeration>>
        ACTIVE
        ERROR
    }
    class SensorPosition {
        <<enumeration>>
        FRONT
        LEFT
        RIGHT
    }

    class RVC {
        -state : RVCState
        +startCleaning() void
    }

    class Controller {
        -pollingInterval : int
        +startCleaning() void
        +reportObstacle(position : SensorPosition) void
        +reportDust(dustLevel : float) void
        +reportSensorError(sensorId : String) void
        -avoidFrontObstacle() void
        -avoidAllDirectionObstacle() void
        -boostCleaningPower() void
        -pollSensors() void
        -checkSideObstacles() SensorPosition
        -recordObstacleDetection(position : SensorPosition) void
        -recordDustDetection(dustLevel : float) void
        -validateSensorData(sensorId : String) boolean
        -retainLastValidState() void
    }

    class MovementUnit {
        -currentDirection : Direction
        -speed : float
        +moveForward() void
        +moveBackward() void
        +stop() void
        +turn(direction : Direction) void
        +getDirection() Direction
    }

    class CleaningUnit {
        -powerLevel : PowerLevel
        -boostDuration : int
        -isActive : boolean
        +startCleaning() void
        +setPowerLevel(level : PowerLevel) void
        +boostPower() void
        +restoreNormalPower() void
        +getIsActive() boolean
    }

    class Sensor {
        <<abstract>>
        -sensorId : String
        -status : SensorStatus
        +getStatus() SensorStatus
        +getSensorId() String
        +readData()* Object
    }

    class ObstacleSensor {
        -position : SensorPosition
        -obstacleDetected : boolean
        +isObstacleDetected() boolean
        +getPosition() SensorPosition
        +readData() boolean
    }

    class DustSensor {
        -dustLevel : float
        -dustDetected : boolean
        +isDustDetected() boolean
        +getDustLevel() float
        +readData() float
    }

    RVC "1" *-- "1" Controller : contains
    RVC "1" *-- "1" MovementUnit : contains
    RVC "1" *-- "1" CleaningUnit : contains
    Controller "1" o-- "1..*" Sensor : monitors
    Controller "1" --> "1" MovementUnit : commands
    Controller "1" --> "1" CleaningUnit : commands
    Sensor <|-- ObstacleSensor
    Sensor <|-- DustSensor

    RVC ..> RVCState
    MovementUnit ..> Direction
    CleaningUnit ..> PowerLevel
    Sensor ..> SensorStatus
    ObstacleSensor ..> SensorPosition
```

![Design Class Diagram](diagrams/class_diagram.png)

---

## 2. 클래스 정의

### RVC
| 구분 | 이름 | 타입 | 설명 |
|------|------|------|------|
| 속성 | -state | RVCState | 현재 RVC 동작 상태 |
| 메서드 | +startCleaning() | void | 청소 시작 — Controller에 위임 |

### Controller
| 구분 | 이름 | 파라미터 / 반환 | 설명 |
|------|------|----------------|------|
| 속성 | -pollingInterval | int | 센서 폴링 주기 (ms, ≤ 100) |
| **공개** | +startCleaning() | void | 청소 시작 명령 |
| **공개** | +reportObstacle(position) | void | 장애물 센서 → Controller 알림 |
| **공개** | +reportDust(dustLevel) | void | 먼지 센서 → Controller 알림 |
| **공개** | +reportSensorError(sensorId) | void | 센서 오류 → Controller 알림 |
| 비공개 | -avoidFrontObstacle() | void | 전방 장애물 회피 흐름 (SSD-03) |
| 비공개 | -avoidAllDirectionObstacle() | void | 전방향 장애물 회피 흐름 (SSD-05) |
| 비공개 | -boostCleaningPower() | void | 청소 파워 증가 흐름 (SSD-07) |
| 비공개 | -pollSensors() | void | 주기적 센서 상태 조회 |
| 비공개 | -checkSideObstacles() | SensorPosition | 비어 있는 좌·우 방향 반환 |
| 비공개 | -validateSensorData(sensorId) | boolean | 센서값 유효성 검사 |
| 비공개 | -retainLastValidState() | void | 이전 유효 상태 유지 |

### MovementUnit
| 구분 | 이름 | 파라미터 / 반환 | 설명 |
|------|------|----------------|------|
| 속성 | -currentDirection | Direction | 현재 이동 방향 |
| 속성 | -speed | float | 현재 이동 속도 |
| 메서드 | +moveForward() | void | 전방 이동 |
| 메서드 | +moveBackward() | void | 후방 이동 |
| 메서드 | +stop() | void | 이동 정지 |
| 메서드 | +turn(direction) | void | 지정 방향으로 회전 |
| 메서드 | +getDirection() | Direction | 현재 방향 반환 |

### CleaningUnit
| 구분 | 이름 | 파라미터 / 반환 | 설명 |
|------|------|----------------|------|
| 속성 | -powerLevel | PowerLevel | 현재 청소 파워 수준 |
| 속성 | -boostDuration | int | 파워 부스트 지속 시간 (ms) |
| 속성 | -isActive | boolean | 청소 활성화 여부 |
| 메서드 | +startCleaning() | void | 청소 시작 |
| 메서드 | +setPowerLevel(level) | void | 파워 수준 직접 설정 |
| 메서드 | +boostPower() | void | 파워 BOOSTED 전환 |
| 메서드 | +restoreNormalPower() | void | 파워 NORMAL 복귀 |
| 메서드 | +getIsActive() | boolean | 청소 활성 여부 반환 |

### Sensor (abstract)
| 구분 | 이름 | 파라미터 / 반환 | 설명 |
|------|------|----------------|------|
| 속성 | -sensorId | String | 센서 고유 ID |
| 속성 | -status | SensorStatus | 센서 상태 (ACTIVE / ERROR) |
| 메서드 | +getStatus() | SensorStatus | 센서 상태 반환 |
| 메서드 | +getSensorId() | String | 센서 ID 반환 |
| **추상** | +readData()* | Object | 센서 데이터 읽기 (하위 클래스 구현) |

### ObstacleSensor
| 구분 | 이름 | 파라미터 / 반환 | 설명 |
|------|------|----------------|------|
| 속성 | -position | SensorPosition | 센서 위치 (FRONT / LEFT / RIGHT) |
| 속성 | -obstacleDetected | boolean | 장애물 감지 여부 |
| 메서드 | +isObstacleDetected() | boolean | 장애물 유무 반환 |
| 메서드 | +getPosition() | SensorPosition | 센서 위치 반환 |
| 메서드 | +readData() | boolean | 장애물 감지값 반환 (Sensor 구현) |

### DustSensor
| 구분 | 이름 | 파라미터 / 반환 | 설명 |
|------|------|----------------|------|
| 속성 | -dustLevel | float | 측정된 먼지 농도 |
| 속성 | -dustDetected | boolean | 먼지 감지 여부 |
| 메서드 | +isDustDetected() | boolean | 먼지 유무 반환 |
| 메서드 | +getDustLevel() | float | 먼지 농도값 반환 |
| 메서드 | +readData() | float | 먼지 농도 반환 (Sensor 구현) |

---

## 3. 관계 정의

| 관계 | From | To | 다중성 | 표기 | 의미 |
|------|------|----|--------|------|------|
| Composition | RVC | Controller | 1:1 | `*--` | RVC 소멸 시 Controller도 소멸 |
| Composition | RVC | MovementUnit | 1:1 | `*--` | RVC 소멸 시 MovementUnit도 소멸 |
| Composition | RVC | CleaningUnit | 1:1 | `*--` | RVC 소멸 시 CleaningUnit도 소멸 |
| Aggregation | Controller | Sensor | 1:1..* | `o--` | 센서는 교체·추가 가능 (느슨한 소유) |
| Association | Controller | MovementUnit | 1:1 | `-->` | 이동 명령 전달 |
| Association | Controller | CleaningUnit | 1:1 | `-->` | 청소 명령 전달 |
| Generalization | Sensor | ObstacleSensor | — | `<\|--` | 장애물 센서는 Sensor의 구체 구현 |
| Generalization | Sensor | DustSensor | — | `<\|--` | 먼지 센서는 Sensor의 구체 구현 |
| Dependency | 각 클래스 | Enum | — | `..>` | 타입으로 사용 |

---

## 4. Domain Model → Design Class Diagram 주요 변경

| 항목 | Domain Model | Design Class Diagram |
|------|-------------|---------------------|
| 메서드 | 없음 | SSD System Operations 기반 도출 |
| Controller 공개 API | 없음 | `reportObstacle`, `reportDust`, `reportSensorError` |
| Sensor.readData() | 없음 | 추상 메서드로 정의 (다형성 적용) |
| Obstacle / Dust 클래스 | 환경 개념으로 존재 | 제거 — ObstacleSensor·DustSensor의 상태값으로 대체 |
| 가시성 표기 | 없음 | `+` public / `-` private 명시 |

---

## 5. 열거형 (Enumeration) 정의

| Enum | 값 | 사용 클래스 |
|------|----|------------|
| **RVCState** | CLEANING, STOPPED, TURNING, REVERSING | RVC |
| **Direction** | FORWARD, BACKWARD, LEFT, RIGHT | MovementUnit |
| **PowerLevel** | NORMAL, BOOSTED | CleaningUnit |
| **SensorStatus** | ACTIVE, ERROR | Sensor |
| **SensorPosition** | FRONT, LEFT, RIGHT | ObstacleSensor |
